#include <stdio.h>
#include <stdlib.h>
#include <time.h>

double *generateRandomDoubleArray(double originArray[], int n);
int myCompareFunction(const double *p1, const double *p2);
void showArray(double array[], size_t n);

int main(int argc, char const *argv[])
{
    // 使用qsort()函数进行排序
    double array[300];
    generateRandomDoubleArray(array, 300);
    showArray(array, 300);

    // int (*myCompareFunctionPointer)(const double *, const double *) = myCompareFunction;
    puts("\n");
    puts("\n");
    puts("\n");

    qsort(array, 300, sizeof(double), myCompareFunction);
    showArray(array, 300);

    return 0;
}

/**
 * @brief 填充double类型的数组
 *
 * @param originArray 传入的数组
 * @param n 填充数量
 * @return double* 传入数组的指针
 */
double *generateRandomDoubleArray(double originArray[], int n)
{
    if (n >= 1)
    {
        srand((unsigned)time(NULL));
        while (n--)
        {
            originArray[n] = (double)rand() / (double)RAND_MAX;
        }
        return originArray;
    }
    else
        return NULL;
}

/**
 * @brief 打印数组
 *
 * @param array 数组
 * @param n 数量
 */
void showArray(double array[], size_t n)
{
    for (size_t n = 0; n < 300; n++)
    {
        printf("%lf\t", array[n]);
        if (n % 6 == 0)
        {
            puts("\n");
        }
    }
}

/**
 * @brief 产生一定数量的随机double数组
 *
 * @param n 产生的数量
 * @return double* 返回产生double数组的指针
 */
// double *generateRandomDoubleArray(int n)
// {
//     if (n >= 1)
//     {
//         // 开辟足够的空间
//         double *newArray = (double *)malloc(sizeof(double) * n);
//         srand((unsigned)time(NULL));
//         while (n--)
//         {
//             //填充数组
//             *newArray++ = rand() / (double)RAND_MAX;
//         }
//         return newArray - n;
//     }
//     else return NULL;
// }

int myCompareFunction(const double *p1, const double *p2)
{
    const double *a1 = (const double *)p1;
    const double *a2 = (const double *)p2;
    if (*a1 < *a2)
    {
        return -1;
    }
    else if (*a1 == *a2)
    {
        return 0;
    }
    else
    {
        return 1;
    }
}